package cn.tedu.hongbeifang.service.impl;

import cn.tedu.hongbeifang.ex.ServiceException;
import cn.tedu.hongbeifang.mapper.VideoMapper;
import cn.tedu.hongbeifang.pojo.dto.VideoAddNewDTO;
import cn.tedu.hongbeifang.pojo.dto.VideoUpdateDTO;
import cn.tedu.hongbeifang.pojo.entity.Video;
import cn.tedu.hongbeifang.pojo.vo.VideoListVO;
import cn.tedu.hongbeifang.pojo.vo.VideoStandVO;
import cn.tedu.hongbeifang.service.IVideoService;
import cn.tedu.hongbeifang.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;


@Service
@Slf4j
public class VideoServiceImpl implements IVideoService {


    @Autowired
    private VideoMapper videoMapper;
    @Value("${dirPath}")
    private String dirPath;
    @Override
    public String upload(MultipartFile picFile) throws IOException {
        String fileName = picFile.getOriginalFilename();
        log.debug("接收到的视频名:{}",fileName);
        String suffix = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID()+suffix;
        //准备日期相关的路径部分   /2023/02/15/
        SimpleDateFormat format = new SimpleDateFormat("/yyyy/MM/dd/");
        String datePath = format.format(new Date());
        File dirFile = new File(dirPath+datePath);
        if(!dirFile.exists()){
            dirFile.mkdirs();
        }
        String filePath = dirPath+datePath+fileName;
        //保存文件 异常抛出
        picFile.transferTo(new File(filePath));
        //把日期路径和文件名拼接后响应给客户端    /2023/02/14/xxx.jpg
        return datePath+fileName;
    }

    public void remove(String url){
        new File(dirPath+url).delete();
    }

    @Override
    public void addNew(VideoAddNewDTO videoAddNewDTO) {
        log.debug("开始处理【添加视频】的业务，参数：{}", videoAddNewDTO);
        String url = videoAddNewDTO.getVideoUrl();
        int count = videoMapper.countByTitle(url);
        log.debug("根据url【{}】统计数量，结果：{}", url, count);
        //判断统计结果是否大于0
        if (count > 0) {
            // 是：url被占用，抛出异常
            String message = "添加视频失败，视频url已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        //创建 视频 对象
        Video video = new Video();
        // 调用BeanUtils.copyProperties(源,目标)将参数对象中的属性复制到视频对象中
        BeanUtils.copyProperties(videoAddNewDTO,video);
        // 调用Mapper对象的insert()执行插入视频数据
        log.debug("即将执行插入数据，参数：{}", video);
        // 调用BeanUtils.copyProperties(源,目标)将参数对象中的属性复制到视频对象中
        int rows = videoMapper.insert(video);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
    }

    @Override
    public void deleteById(Long videoId) {
        log.debug("开始处理【根据ID删除轮播图】的业务，参数：{}", videoId);
        // 调用Mapper对象的getStandardById()执行查询
        VideoStandVO video = videoMapper.getStandardById(videoId);
        log.debug("根据ID={}检查视频数据是否存在，查询结果：{}", videoId, video);
        //判断查询结果是否为null
        if (video == null) {
            // 是：数据不存在，抛出异常
            String message = "删除轮播图失败，尝试删除的轮播图数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }

        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", videoId);
        int rows = videoMapper.deleteById(videoId);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
        this.remove(video.getVideoUrl());
    }

    @Override
    public void updateInfoById(Long videoId, VideoUpdateDTO videoUpdateDTO) {
        log.debug("开始处理【修改轮播图详情】的业务，ID：{}，新数据：{}", videoId, videoUpdateDTO);
        // 调用Mapper对象的getStandardById()执行查询
        VideoStandVO queryResult = videoMapper.getStandardById(videoId);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：抛出异常
            String message = "修改视频详情失败，尝试修改的视频数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }


        int count = videoMapper.countByVideoTitleAndNotId(videoId, videoUpdateDTO.getVideoUrl());
        // 判断统计结果是否大于0
        if (count > 0) {
            // 是：url被占用，抛出异常
            String message = "修改视频详情失败，视频url已经被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_CONFLICT, message);
        }

        // 创建Video对象
        Video video = new Video();
        // 复制属性，设置ID
        BeanUtils.copyProperties(videoUpdateDTO, video);
        video.setVideoId(videoId);
        // 调用Mapper对象的update()方法执行修改
        int rows = videoMapper.update(video);
        if (rows!=1){
            String message="服务器正忙,请稍后再试!";
            throw new ServiceException(ServiceCode.ERROR_UPDATE,message);
        }
        if(!videoUpdateDTO.getVideoUrl().equals(queryResult.getVideoUrl())){
            this.remove(video.getVideoUrl());
        }
    }

    @Override
    public VideoStandVO getStandardById(Long videoId) {
        log.debug("开始处理【根据ID查询视频详情】的业务，参数：{}", videoId);
        VideoStandVO queryResult = videoMapper.getStandardById(videoId);
        if (queryResult == null) {
            // 是：抛出异常
            String message = "查询视频详情失败，视频数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERROR_NOT_FOUND, message);
        }
        return queryResult;
    }

    @Override
    public List<VideoListVO> list() {
        log.debug("开始处理【查询轮播图列表】的业务，无参数");
        List<VideoListVO> list = videoMapper.list();
        return list;
    }
}
